﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Reflection;
using System.IO;
using System.Diagnostics;

namespace template_dll
{
    public partial class ChildForm : Form
    {
        public ChildForm()
        {
            InitializeComponent();
        }

        private const string namechcol = "Флаг";
        private DateTime day_b;                                         //- Дата начала отчёта 
        private DateTime day_s;                                         //- Дата окончания отчёта
        private SqlConnection conn;
        private DataTable dt_rep;
        private delegate void Deleg();
        private Deleg del;
        private DataTable dt_pharm = new DataTable();                   //- Для вывода списка аптек
        private DataTable pharm = new DataTable();                      //- Список выбранных аптек
        private DataTable dt_ph = new DataTable();                      //- Для вывода аптек куда перемещать
        private DataTable ph = new DataTable();                         //- Список аптек куда перемещать
        private DataTable dt_ul = new DataTable();                      //- Для вывода списка юр.лиц
        private DataTable ul = new DataTable();                         //- Список выбранных юр.лиц
        
        public static bool DisplayForm(System.Windows.Forms.Form theMDIParent)
        {
            ChildForm f = new ChildForm();
            f.MdiParent = theMDIParent;
            f.WindowState = FormWindowState.Maximized;
            f.Show();
            return true;
        }

        private string GetServ(string filename)
        {
            string str = "";
            using (StreamReader streamReader = new StreamReader(filename))
            {
                while (!streamReader.EndOfStream)
                {
                    str += streamReader.ReadLine();
                }
            }
            return str;
        }

        private void ChildForm_Load(object sender, EventArgs e)
        {
            conn = new SqlConnection(@"Server=" + GetServ("serv.txt") + ";Database=PharmOLAPDW;Integrated Security=True");
            this.Text = "Перемещение неликвида из САП";
            conn.Open();
            dt_pharm = DownloadData(conn, dt_pharm, "pas_PharmSel");
            conn.Close();
            day_b = DateTime.Now.AddDays(-1).Date;
            day_s = DateTime.Now.AddDays(-1).Date;
            dateTimePicker1.Value = DateTime.Now.AddDays(-1).Date;
            dateTimePicker2.Value = DateTime.Now.AddDays(-1).Date;
            dt_rep = new DataTable();
            }

        private void StartCreateRep(object sender, EventArgs e)
        {
            dataGridView1.DataSource = null;
            dt_rep.Clear();
            del = new Deleg(CreateRep);
            this.Text += " Формируется";
            IAsyncResult asyncRes = del.BeginInvoke(new AsyncCallback(CallBackFunc), null); //
            panel1.Enabled = false;
            dataGridView1.Enabled = false;
        }

        private void CallBackFunc(IAsyncResult aRes)
        {
            del.EndInvoke(aRes);
            panel1.Invoke((Func<bool>)(() => panel1.Enabled = true));
            dataGridView1.Invoke((Func<bool>)(() => dataGridView1.Enabled = true));
            this.Invoke((Func<string>)(() => this.Text = this.Text.Replace(" Формируется", "")));
            if (dt_rep.Rows.Count > 0)
            {
                dataGridView1.Invoke((Func<object>)(() => dataGridView1.DataSource = dt_rep.DefaultView));
            }
        }

        private void CreateRep()
        {
            if (conn.State == ConnectionState.Closed) conn.Open();
            try
            {
                DataTable tmp = new DataTable();
                tmp.Columns.Add();
                foreach(DataRow dd in pharm.Rows)
                {
                    DataRow dr = tmp.NewRow();
                    for (int i = 0; i < pharm.Rows.Count; i++)
                    {
                        dr[0] = Convert.ToInt32(dd[1].ToString());
                    }
                    tmp.Rows.Add(dr);
                }
                SqlStorProc sql = new SqlStorProc();
                SqlStorProc.sp_params[] par = new SqlStorProc.sp_params[3];
                par[0].name = "@dt_befpur_beg";
                par[0].value = day_b;
                par[1].name = "@dt_befpur_end";
                par[1].value = day_s;
                par[2].name = "@pharmcode";
                //par[2].value = dt_pharm
                dt_rep = (new SqlStorProc()).SqlProcExecWithQueryOneTable(conn, "pas_LiquidityTransport", 300, par);
                conn.Close();
                dataGridView1.DataSource = dt_rep.DefaultView;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                conn.Close();
            }

        }

        private SqlDataReader RepProc(SqlConnection sqlcon)//метод для вызова хранимки
        {
            SqlCommand sqlcom = sqlcon.CreateCommand();
            sqlcom.CommandType = CommandType.StoredProcedure;
            sqlcom.CommandText = @"sp_name"; //имя хранимой процедуры
            sqlcom.CommandTimeout = 300;

            return sqlcom.ExecuteReader();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //- Фильтр по аптекам
            PharmFilter.PharmFilter p = new PharmFilter.PharmFilter();
            pharm = dt_pharm.Clone();
            p.dataGridView1.DataSource = dt_pharm.DefaultView;
            p.namechcol = namechcol;
            p.Text = "Фильтр по аптекам";
            p.sortcoumn = "Город";
            p.StartPosition = FormStartPosition.CenterScreen;
            DialogResult res = p.ShowDialog();
            p.Close();
            int fl = 0;
            listBox1.Items.Clear();
            fl = 0;
            foreach (DataRow dr in dt_pharm.Rows)
            {
                if (Convert.ToBoolean(dr["Флаг"]))
                {
                    fl++;
                    DataRow dd = pharm.NewRow();
                    listBox1.Items.Add(dr["Аптека"].ToString());
                    for (int i = 0; i < dt_pharm.Columns.Count; i++)
                    {
                        dd[i] = dr[i];
                    }
                    pharm.Rows.Add(dd);
                }
            }
            if (fl == 0)
            {
                listBox1.Items.Add("Все");
            }
            dataGridView1.DataSource = pharm.DefaultView;
        }

        private DataTable DownloadData(SqlConnection con, DataTable dt, string proc)
        {
            SqlCommand pharm = con.CreateCommand();
            pharm.CommandText = proc;
            pharm.CommandType = CommandType.StoredProcedure;
            dt = new DataTable();
            dt.Load(pharm.ExecuteReader());
            dt.Columns[0].ReadOnly = false;
            return dt;
        }

        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
        {
            //- Дата начала отчёта
            day_b = dateTimePicker1.Value;
        }

        private void dateTimePicker2_ValueChanged(object sender, EventArgs e)
        {
            //- Дата окончания отчёта
            day_s = dateTimePicker2.Value;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //- Выгрузить в Excel
            if (dataGridView1.DataSource == null)
            {
                MessageBox.Show("Нет данных для выгрузки в Excel");
                return;
            }
            ExpToExcel ex = new ExpToExcel();
            ex.ExportToExcel(dataGridView1);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            //- Выбор аптек для перемещения (куда перемещать)
            PharmFilter.PharmFilter p = new PharmFilter.PharmFilter();
            ph = dt_pharm.Clone();
            p.dataGridView1.DataSource = dt_pharm.DefaultView;
            p.namechcol = namechcol;
            p.Text = "Фильтр по аптекам";
            p.sortcoumn = "Город";
            p.StartPosition = FormStartPosition.CenterScreen;
            DialogResult res = p.ShowDialog();
            p.Close();
            int fl = 0;
            listBox1.Items.Clear();
            fl = 0;
            foreach (DataRow dr in dt_pharm.Rows)
            {
                if (Convert.ToBoolean(dr["Флаг"]))
                {
                    fl++;
                    DataRow dd = ph.NewRow();
                    listBox1.Items.Add(dr["Аптека"].ToString());
                    for (int i = 0; i < dt_pharm.Columns.Count; i++)
                    {
                        dd[i] = dr[i];
                    }
                    ph.Rows.Add(dd);
                }
            }
            if (fl == 0)
            {
                listBox2.Items.Add("Все");
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            //- Выбор юр. лица (куда перемещать)
            PharmFilter.PharmFilter p = new PharmFilter.PharmFilter();
            p.dataGridView1.DataSource = dt_pharm.DefaultView;
            p.namechcol = namechcol;
            p.Text = "Фильтр по юридическим лицам";
            p.sortcoumn = "Юр. лицо";
            p.StartPosition = FormStartPosition.CenterScreen;
            DialogResult res = p.ShowDialog();
            p.Close();
            int fl = 0;
            listBox1.Items.Clear();
            fl = 0;
            foreach (DataRow dr in dt_pharm.Rows)
            {
                if (Convert.ToBoolean(dr["Флаг"]))
                {
                    fl++;
                    DataRow dd = ph.NewRow();
                    listBox1.Items.Add(dr["Аптека"].ToString());
                    for (int i = 0; i < dt_pharm.Columns.Count; i++)
                    {
                        dd[i] = dr[i];
                    }
                    ph.Rows.Add(dd);
                }
            }
            if (fl == 0)
            {
                listBox2.Items.Add("Все");
            }

        }

    }
}
